/* 
    generator 函数 返回的迭代器
    内部的 yield 除了可以给外部返回数据，还可以想内部传递数据
*/

const fs = require('fs');
const utils = require('util');
const co = require('co')

/* 把异步的文件读取 Promise */
const readFile = utils.promisify(fs.readFile);



function* run() {
    // yield 一个promise对象
    let a = yield readFile('./data/1.txt');
    // console.log(a.toString());

    let b = yield readFile('./data/2.txt');
    // console.log(b.toString());

    let c = yield readFile('./data/3.txt');
    // console.log(c.toString());

    return a + b + c;

}

// const it = run();

/* it.next().value.then(data => {

    it.next(data.toString()).value.then(data => {

        it.next(data.toString()).value.then(data => {

            console.log(it.next(data.toString()));

        })

    })

}) */

/* 如果现在可以让 迭代器自动的完成操作，而不是 自己手工的去 不断的 递归，那么我们就可以使用同步的方式去写异步代码 
    javascript 大牛  tj  后面 nodejs 框架 express koa 的作者

    https://www.koajs.com.cn/

    写了一个 co 库，可以帮我们自动的执行 迭代器。


    > npm init -y
    > npm i co --save


*/
let c1 = co(run); // co 接收一个 生成器函数，自动调用迭代器 next 方法，返回值是一个Promise对象

c1.then((data) => {
    console.log('data', data);
});